package br.unicamp.ft.sahp.model.dao.impl;

import java.util.List;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import br.unicamp.ft.sahp.model.dao.AbstractDAO;
import br.unicamp.ft.sahp.model.dao.SistemaDAO;
import br.unicamp.ft.sahp.model.entidades.Avaliador;
import br.unicamp.ft.sahp.model.entidades.Sistema;
import br.unicamp.ft.sahp.model.exception.LinkNaoEncontradoException;
import br.unicamp.ft.sahp.model.exception.SistemaNaoEncontradoException;

@Repository
public class SistemaDAOImpl extends AbstractDAO<Sistema, Long> implements
		SistemaDAO {

	@Autowired
	public SistemaDAOImpl(
			@Qualifier("entityManagerFactory") EntityManagerFactory factory) {
		super(factory, Sistema.class);
	}

	@SuppressWarnings("unchecked")
	public List<Sistema> findLinksByNome(String nomeSistema)
			throws SistemaNaoEncontradoException {
		String consulta = "SELECT sistema FROM Sistema sistema "
				+ "WHERE UPPER(sistema.nomeSistema) LIKE '%' || UPPER(:nomeSistema) || '%'";

		Query query = getEntityManager().createQuery(consulta);
		query.setParameter("nomeSistema", nomeSistema);

		List<Sistema> listaResultados = query.getResultList();

		if (listaResultados == null || listaResultados.isEmpty()) {
			throw new SistemaNaoEncontradoException();
		}

		return listaResultados;
	}

	@SuppressWarnings("unchecked")
	public List<Sistema> findLinksByAvaliador()
			throws LinkNaoEncontradoException {

		String consulta = "SELECT avaliador FROM Avaliador avaliador "
				+ "WHERE avaliador.login = :usuario AND avaliador.senha = :senha";

		Query query = getEntityManager().createQuery(consulta);
		// query.setParameter("usuario", usuario);
		// query.setParameter("senha", senha);

		List<Avaliador> listaAvaliadores = null;
		listaAvaliadores = query.getResultList();
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Sistema> findLinksSemAvaliacao()
			throws SistemaNaoEncontradoException {
		
		String consulta = "SELECT sistema FROM Sistema sistema "
				+ "WHERE sistema.avaliacao IS NULL";

		Query query = getEntityManager().createQuery(consulta);

		List<Sistema> listaResultados = query.getResultList();

		if (listaResultados == null || listaResultados.isEmpty()) {
			throw new SistemaNaoEncontradoException();
		}
		
		return listaResultados;
	}
	
	@SuppressWarnings("unchecked")
	public List<Sistema> findLinksNaoAvaliadosSemTexto() throws SistemaNaoEncontradoException {
		String consulta = "SELECT sistema FROM Sistema sistema " +
				"WHERE sistema.avaliacao.relatorioAvaliacao IS NULL " +
				"AND sistema.avaliacao.texto.textoObjetivo IS NULL";
		
		Query query = getEntityManager().createQuery(consulta);

		List<Sistema> listaResultados = query.getResultList();

		if (listaResultados == null || listaResultados.isEmpty()) {
			throw new SistemaNaoEncontradoException();
		}
		
		return listaResultados;
	}
	
	@SuppressWarnings("unchecked")
	public List<Sistema> findAllLinks() throws SistemaNaoEncontradoException {
		String consulta = "SELECT sistema FROM Sistema sistema";
		
		Query query = getEntityManager().createQuery(consulta);
		List<Sistema> listaResultados = query.getResultList();
		
		if (listaResultados == null || listaResultados.isEmpty()) {
			throw new SistemaNaoEncontradoException();
		}
		
		return listaResultados;
	}
}
